透過前幾天的討論,我們應該能列出符合遊戲需要的成就清單。
也應該能建置成功成就資料表了。
但這些還不能算是已經建置好我們的成就系統了,因為他並不會自動運作起來。
要讓他真正產生作用,要將整個成就獲得的行為串連起來才行。
成就獲得的行為流程如下:
確定得到成就之後:
這表示最少有三件事我們要做到:
將工作拆成AchieveManager類別的建立、資料表的建立、畫面的刻畫及通知的發送,
今天會先把前面的部份完成。
在 main.dart 裡
Future<void> main() async {
///連結硬體
WidgetsFlutterBinding.ensureInitialized();
///設為全螢幕
Flame.device.fullScreen();
var defaultHome = const LoginPage();
final SharedPreferences prefs = await SharedPreferences.getInstance();
StaticFunction.prefs = prefs;
StaticFunction.getInstance().checkAchieveListBuild();
......
}
在 StaticFunction class 裡
checkAchieveListBuild() async {
String? dataString = prefs.getString("achieve_data");
if(dataString == null){
dataString = await rootBundle.loadString('assets/achieve_data.json');
await prefs.setString("achieve_data",dataString);
}
}
Map<dynamic,dynamic> data
的方式,寫入並記錄相關的數據,像是這樣:///登入時都會呼叫這個方法
UserData? getAccount () {
String? dataString = prefs.getString("user_data");
print(dataString);
///在這裡加一次登入次數
achieveManager.add({"login_times":1});
return dataString != null ? UserData.fromJson(jsonDecode(dataString)) : null;
}
在AchieveManager裡 add方法的設計
add(Map dataInput) async {
///取得使用者的記錄資料
String? recordString = prefs.getString("user_records");
Map recordData = jsonDecode(recordString??"{}");
///傳入的資料若是數值表示要加上該數值,若是其他,則是覆寫
if(dataInput[dataInput.keys.first] is int){
int addValue = dataInput[dataInput.keys.first]??0;
int oldValue = recordData[dataInput.keys.first]??0;
recordData[dataInput.keys.first] = oldValue + addValue;
}else{
recordData[dataInput.keys.first] = dataInput[dataInput.keys.first];
}
await prefs.setString("user_records",jsonEncode(recordData));
///印出來在後台看
print(recordData);
}
成功給寫入方法保留了最大的自由度,不論是key值還是類型(之前提過的一次或累計)都沒有寫死。
compareAchieve(String key, recordData){
List achieveList = jsonDecode(prefs.getString("achieve_data")??"[{}]");
for(int i=0;i<achieveList.length;i++){
if(achieveList[i]["ID"].toString().compareTo(key)==0 && achieveList[i]["AMOUNT"] == recordData){
achieveList[i]["HIDDEN"] = false;
///印在後台
print("獲得成就 名稱: ${achieveList[i]["NAME"]} \n ${achieveList[i]["DESCRIPTION"]}");
}
}
}
其實滿簡單的,但這只有後台看得到,明天讓使用者無法乎視我~